package com.pmc.prototipo.entities;



import org.apache.commons.math.FunctionEvaluationException;
import org.apache.commons.math.MaxIterationsExceededException;
import org.apache.commons.math.analysis.UnivariateRealFunction;
import org.apache.commons.math.analysis.integration.RombergIntegrator;
import org.apache.commons.math.ode.IntegratorException;

public class Entropia {

    public final static double SEDENTARIO = 1.0;
    public final static double BAJA_ACTIVIDAD = 1.5;
    public final static double ACTIVO = 1.75;
    public final static double MUY_ACTIVO = 2.2;
//Eficiencias
    public final static double efGlucosa = 38.2;
    public final static double efProteina = 10.4;
    public final static double efGrasas = 32.2;
//Gibbs
    public final static double gibGlucosa = 16070;
    public final static double gibProteina = 22430;
    public final static double gibGrasas = 38465;
//HHV
    public final static double HHVGlucosa = 15630;
    public final static double HHVProteina = 22790;
    public final static double HHVGrasas = 39125;
    private double peso;
    private double altura;
    private double edad;
    private double PAL;
    private double PA;
    private double temp;
    private double mesesBabies;
    private boolean sex;
    private boolean embarazada;
    private boolean bebe;
    UnivariateRealFunction entRate;

    public Entropia(double peso, double altura, double edad, boolean esBebe, char embarazo, String estadoEnergetico, String sexo, double temperatura) throws Exception {
        this.peso = peso;
        this.bebe = esBebe;
        this.altura = altura;
        edad = 0;
        mesesBabies = 0;
        if (esBebe == true) {
            if (edad >= 0 && edad <= 35) {
                this.mesesBabies = edad;
            } else {
                throw new Exception("Error introduciendo edad del bebe");
            }
        } else {
            this.edad = edad;
        }
        this.temp = temperatura;
        if (sexo.equalsIgnoreCase("masculino")) {
            sex = true;
        } else if (sexo.equalsIgnoreCase("femenino")) {
            sex = false;
            if (embarazo == 's' || embarazo == 'S') {
                embarazada = true;
            } else if (embarazo == 'n' || embarazo == 'N') {
                embarazada = false;
            } else {
                throw new Exception("Error introduciendo valores de embarazo");
            }
        }
        if (edad >= 3 && esBebe == false) {
            if (estadoEnergetico.equalsIgnoreCase("activo")) {
                PAL = ACTIVO;
                PA = 1.26;
            } else if (estadoEnergetico.equalsIgnoreCase("sedentario")) {
                PAL = SEDENTARIO;
                PA = 1.0;
            } else if (estadoEnergetico.equalsIgnoreCase("poco activo")) {
                PAL = BAJA_ACTIVIDAD;
                PA = 1.13;
            } else if (estadoEnergetico.equalsIgnoreCase("muy activo")) {
                PAL = MUY_ACTIVO;
                PA = 1.42;
            } else {
                throw new Exception("Error introduciendo estado energetico");
            }
        }
        entRate = new UnivariateRealFunction() {

            @Override
            public double value(double t) throws FunctionEvaluationException {
                return (((1 - efProteina) * (calcularFlujoMasico("proteinas") / 180) * 1000 * gibProteina) + ((1 - efGlucosa) * (calcularFlujoMasico("proteinas") / 119) * 1000 * gibGlucosa) + ((1 - efGrasas) * (calcularFlujoMasico("proteinas") / 256) * 1000 * gibGrasas)) / temp;
            }
        };
    }

    public double calcularEER() {
        double rta = 0.0;
        if (mesesBabies >= 0 && mesesBabies <= 3) {
            rta = 89 * peso - 100 + 175;
        } else if (mesesBabies >= 4 && mesesBabies <= 6) {
            rta = 89 * peso - 100 + 56;
        } else if (mesesBabies >= 7 && mesesBabies <= 12) {
            rta = 89 * peso - 100 + 22;
        } else if (mesesBabies >= 13 && mesesBabies <= 35) {
            rta = 89 * peso - 100 + 20;
        } else if (edad >= 3 && edad <= 8) {
            rta = 88.5 - 61.9 * edad + PA * (26.7 * peso + 903 * altura) + 20;
        } else if (edad >= 9 && edad <= 18) {
            rta = 88.5 - 61.9 * edad + PA * (26.7 * peso + 903 * altura) + 25;
        } else {
            rta = 662 - 9.53 * edad + PA * (15.91 * peso + 539.6 * altura);
        }
        return rta;
    }

    public double calcularFlujoMasico(String grupoNutricional) {
        double rta = 0.0;
        UnivariateRealFunction ecuacionFlujo;
        double eer = calcularEER() * 4.1868;
        if (grupoNutricional.equalsIgnoreCase("proteinas")) {
            if (bebe == true) {
                rta = 1000 * (eer / HHVProteina) - 13.5;
            } else {
                if (edad >= 3 && edad <= 8) {
                    rta = 1000 * (eer / HHVProteina) - 19;
                }
                if (sex == true) {
                    if (edad >= 9 && edad <= 13) {
                        rta = 1000 * (eer / HHVProteina) - 34;
                    } else if (edad >= 14 && edad <= 18) {
                        rta = 1000 * (eer / HHVProteina) - 52;
                    } else if (edad >= 19) {
                        rta = 1000 * (eer / HHVProteina) - 56;
                    }
                }
                if (sex == false) {
                    if (edad >= 9 && edad <= 13) {
                        rta = 1000 * (eer / HHVProteina) - 34;
                    } else if (edad >= 14 && edad <= 18) {
                        rta = 1000 * (eer / HHVProteina) - 46;
                    } else if (edad >= 19) {
                        if (embarazada == true) {
                            rta = 1000 * (eer / HHVProteina) - 71;
                        } else {
                            rta = 1000 * (eer / HHVProteina) - 46;
                        }
                    }
                }
            }
        } else if (grupoNutricional.equalsIgnoreCase("grasas")) {
            if (bebe == true) {
                rta = 1000 * (eer / HHVProteina) - 31;
            } else {
                rta = 1000 * (eer / HHVProteina) * 0.3;
            }
        } else if (grupoNutricional.equalsIgnoreCase("glucosa")) {
            if (bebe == true) {
                rta = 1000 * (eer / HHVProteina) - 95;
            } else {
                rta = 1000 * (eer / HHVProteina) - 130;
            }
        } else {
            try {
                throw new Exception("No es un grupo nutricional válido");
            } catch (Exception e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        rta = rta / (1000 * 24 * 60 * 60);
        return rta;
    }

    public double darEntropiaIntegrada(int t) {
        double rta = 0.0;

        RombergIntegrator integrador = new RombergIntegrator();
        try {
            rta = integrador.integrate(entRate, 0, t) / peso;
        } catch (MaxIterationsExceededException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FunctionEvaluationException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        return rta;
    }
}
